package docker

//dockerfile  	dockerFile 是用来构建docker镜像的文本文件！命令参数脚本
//通过脚本可以生成镜像，镜像是一层一层的，脚本就是一条条的命令，每条命令就是一个层

//dockerfile 常用命令官方文档：https://docs.docker.com/engine/reference/builder/
//参考资料：https://blog.csdn.net/imouse728/article/details/125654297

/*

----------构建步骤----------
	1.构建dockerfile文件
	2.docker build 构建成为一个镜像
	3.docker run 运行镜像
	4.docker push 发布镜像(dockerHub、阿里镜像仓库)


----------dockerfile 构建过程----------
	基础知识
	1.每个保留关键字(指令)都是必须是大写字母
	2.执行从上到下执行
	3.#表示注释
	4.每一个指令(大写字母)都会创建提交一个新的镜像层，并提交
	//看图 images/030dockerfile层级.png

	dockerfile是面向开发的，我们以后要发布项目，就需要编写dockerfile文件，这个文件十分简单

	dockerfile 构建文件，定义了一切的步骤，源代码
	dockerImages：通过dockerfile构建生成的镜像，最终发布和运行
	docker容器：容器就是镜像运行起来提供服务


//原文：https://blog.csdn.net/imouse728/article/details/125654297
----------Dockerfile制作原则----------
Dockerfile是Docker用来构建镜像的文本文件，包含自定义的指令和格式, 可以通过docker build命令从Dockerfile中构建镜像。

与容器与Dockerfile制作相关的规则如下：

	1.基础镜像尽量首先官镜像中的镜像， FROM指令应该包含参数tag;

	2.编写指令时允分利用一指令生成镜像层的原理，尽量安排相同的，不变的部份放在前面；

	3.ADD和COPY指令很相近，但推荐用COPY, ADD可以下载URL和自动下载文件解压并保留原文件，ADD指令用RUN wget或RUN curl代替；

	4.RUN指令不要在一行中单独使用 RUN apt-get update，应该避免使用它，要用也必须把RUN apt-get update && RUN apt-get install写在同一行；

	5.不要在Dockerfile中做端口映射;

	6.由于容器名称唯一,如果容器要扩容,运行容器时就不能指字容器名称;

	7.一容器一进程;

	8.入口运行程序必须SUSPEND;

	9.对外部依赖的变量不能写死在Dockerfile里,必须通过变量在运行期间注入,如连接库连接配置;

	10.日志目录通过volume挂载

	11.配置参数通过环境变量注入;

	12.带ONBUILD指令的必须带特殊标签；

	13.Dockerfile有任何修改,必须修改tag;


----------注意----------

RUN指令exec格式中的参数会当成JSON数据被Docker解析，帮必须使用双引号而不能使用单引号。

RUN指令在构建镜像时执行指令，并生成新的镜像;CMD指令在构建镜像时并不执行任何命令，而是在容器启动时默认将CMD指令作为第一条执行的命令；

ONBUILD指令必须有特殊的标签：
（1）在构建过程中，ONBUILD指令会添加到触发器指令镜像元数据库，这些触发指令不会在当前构建过程中执行;
（2）在构建过程最后，触发器指令会被存储在镜像详情中，其主键是OnBuild,可以使用docker inspect命令查看；
（3）之后该镜像可能作为其他Dockerfile中的FROM指令的参数。在构建过程中，FROM指令会寻找ONBUILD触发器指令，并且会以它们注册的顺序执行。若有触发器指令执行失败，则FROM指令被中止，并返回失败；若所有触发器指令执行成功，则FROM指令完成并继续执行下面的执行。在镜像构建完成之后，触发器指令会被清除，不会被子镜像继承。
（4）使用包含ONBUILD指令的Dockerfile构建的镜像应该有特殊的标签，如easynode:2.0-onbuild.




----------docker build 构建成为一个镜像----------

	通过这个文件构建镜像 【注意后面有【点.】】
		docker build -f dockerfile文件路径 -t 镜像名:[版本号] .


root@VM-4-8-debian:# docker build -f Dockerfile -t dockerfile-go-app-test:1.0 .
Sending build context to Docker daemon  10.43MB
Step 1/17 : FROM golang:1.19															#第一步，下拉
 ---> 4f7c78c9b46f
Step 2/17 : MAINTAINER zydh "1138552759@qq.com"
 ---> Using cache
 ---> 10b6db99bc09
Step 3/17 : ENV WORKDIRPATH /home/zydh/docker/www/dockfile_test
 ---> Using cache
 ---> cda9aba7a409
Step 4/17 : ENV VOLUMEPATH /home/zydh/docker/volume
 ---> Using cache
 ---> f16f9bc27014
Step 5/17 : RUN mkdir -p $WORKDIRPATH
 ---> Using cache
 ---> 7dab2f47d8bf
Step 6/17 : RUN mkdir -p $VOLUMEPATH/dockfile_test/static
 ---> Using cache
 ---> 330c3f6e93e2
Step 7/17 : RUN mkdir -p $VOLUMEPATH/dockfile_test/conf
 ---> Using cache
 ---> a7c4585cef14
Step 8/17 : WORKDIR $WORKDIRPATH
 ---> Using cache
 ---> 63ee06b35ec5
Step 9/17 : COPY . .
 ---> 4d20577f0e56
Step 10/17 : RUN chmod +x ./bin/dft
 ---> Running in 31e78725af86
Removing intermediate container 31e78725af86
 ---> 00c6e191fd6a
Step 11/17 : VOLUME ["$VOLUMEPATH/dockfile_test/static","/static"]
 ---> Running in 7eb1aceaf1e2
Removing intermediate container 7eb1aceaf1e2
 ---> c015339763ae
Step 12/17 : VOLUME ["$VOLUMEPATH/dockfile_test/conf","/conf"]
 ---> Running in a5d1543f42be
Removing intermediate container a5d1543f42be
 ---> e9401e2d3ea4
Step 13/17 : EXPOSE 8080
 ---> Running in c96d1eb6feb8
Removing intermediate container c96d1eb6feb8
 ---> 3953c8a3f5b0
Step 14/17 : CMD echo $WORKDIRPATH
 ---> Running in 08724f2405f7
Removing intermediate container 08724f2405f7
 ---> 6e75b656d4ab
Step 15/17 : CMD echo $VOLUMEPATH
 ---> Running in 6b0f5a86cadc
Removing intermediate container 6b0f5a86cadc
 ---> 13ffacbb72ea
Step 16/17 : CMD echo "-----load is end,runing-----"
 ---> Running in 7f941c4938cd
Removing intermediate container 7f941c4938cd
 ---> 7fae7359d33c
Step 17/17 : ENTRYPOINT ["./bin/dft"]
 ---> Running in 7c06d4045624
Removing intermediate container 7c06d4045624
 ---> 6a35d9388274
Successfully built 6a35d9388274
Successfully tagged dockerfile-go-app-test:1.0
root@VM-4-8-debian:/home/zydh/www/dockerfile_test#






----------docker run 运行镜像----------

	3.测试运行
		docker images
		docker run -it -p 3306:8080  dockerfile-go-app-test:1.0




root@VM-4-8-debian:/home/zydh/www/dockerfile_test# docker run -it -p 3306:8080  dockerfile-go-app-test:1.0
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:	export GIN_MODE=release
 - using code:	gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /                         --> dockerfile_test/api/apiv1.Index (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080
this is api/apiv1/index()
[GIN] 2022/09/27 - 09:39:46 | 200 |     740.334µs |      172.17.0.1 | GET      "/"




#另起一个ssh

root@VM-4-8-debian:~# curl http://127.0.0.1:3306
{"code":200,"data":"hello world","msg":"this is api/index"}
root@VM-4-8-debian:~#


----------docker inspect 镜像/容器id----------

		docker inspect 6a35d9388274  查看挂载的目录是否正确有效


----------查看镜像的历史----------

	docker history 镜像id

root@VM-4-8-debian:/home/zydh/docker/volume# docker history 6a35d9388274
IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
6a35d9388274   34 minutes ago   /bin/sh -c #(nop)  ENTRYPOINT ["./bin/dft"]     0B
7fae7359d33c   34 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B
13ffacbb72ea   34 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B
6e75b656d4ab   34 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B
3953c8a3f5b0   34 minutes ago   /bin/sh -c #(nop)  EXPOSE 8080                  0B
e9401e2d3ea4   34 minutes ago   /bin/sh -c #(nop)  VOLUME [/home/zydh/docker…   0B
c015339763ae   34 minutes ago   /bin/sh -c #(nop)  VOLUME [/home/zydh/docker…   0B
00c6e191fd6a   34 minutes ago   /bin/sh -c chmod +x ./bin/dft                   10.4MB
4d20577f0e56   34 minutes ago   /bin/sh -c #(nop) COPY dir:58b20f8bfce75bc23…   10.4MB
63ee06b35ec5   36 minutes ago   /bin/sh -c #(nop) WORKDIR /home/zydh/docker/…   0B
a7c4585cef14   36 minutes ago   /bin/sh -c mkdir -p $VOLUMEPATH/dockfile_tes…   0B
330c3f6e93e2   36 minutes ago   /bin/sh -c mkdir -p $VOLUMEPATH/dockfile_tes…   0B
7dab2f47d8bf   37 minutes ago   /bin/sh -c mkdir -p $WORKDIRPATH                0B
f16f9bc27014   45 minutes ago   /bin/sh -c #(nop)  ENV VOLUMEPATH=/home/zydh…   0B
cda9aba7a409   45 minutes ago   /bin/sh -c #(nop)  ENV WORKDIRPATH=/home/zyd…   0B
10b6db99bc09   45 minutes ago   /bin/sh -c #(nop)  MAINTAINER zydh "11385527…   0B
4f7c78c9b46f   13 days ago      /bin/sh -c #(nop) WORKDIR /go                   0B
<missing>      13 days ago      /bin/sh -c mkdir -p "$GOPATH/src" "$GOPATH/b…   0B
<missing>      13 days ago      /bin/sh -c #(nop)  ENV PATH=/go/bin:/usr/loc…   0B
<missing>      13 days ago      /bin/sh -c #(nop)  ENV GOPATH=/go               0B
<missing>      13 days ago      /bin/sh -c set -eux;  arch="$(dpkg --print-a…   459MB
<missing>      13 days ago      /bin/sh -c #(nop)  ENV GOLANG_VERSION=1.19.1    0B
<missing>      13 days ago      /bin/sh -c #(nop)  ENV PATH=/usr/local/go/bi…   0B
<missing>      13 days ago      /bin/sh -c set -eux;  apt-get update;  apt-g…   228MB
<missing>      2 weeks ago      /bin/sh -c apt-get update && apt-get install…   152MB
<missing>      2 weeks ago      /bin/sh -c set -ex;  if ! command -v gpg > /…   19MB
<missing>      2 weeks ago      /bin/sh -c set -eux;  apt-get update;  apt-g…   10.7MB
<missing>      2 weeks ago      /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>      2 weeks ago      /bin/sh -c #(nop) ADD file:ff01c6dedb67cf22e…   124MB
root@VM-4-8-debian:/home/zydh/docker/volume#



*/
